﻿//*********************************************************************
//
//  文件名：Startup
//
//  作者： LW
//
//  作用：
//
//  日期：2015/9/8 16:11:52
//
//*********************************************************************

/*
 *  OWIN是Open Web Server Interface for .NET的首字母缩写，他的定义如下：
 *      OWIN在.NET Web Servers与Web Application之间定义了一套标准接口，
 *      OWIN的目标是用于解耦Web Server和Web Application。基于此标准，
 *      鼓励开发者开发简单、灵活的模块，从而推进.NET Web Development开源生态系统的发展 
 *  
 *  OWIN规范的定义
 *      OWIN定义了Host、Server、Middleware、Application 4Layers（层）
 *      Application Delegate（应用程序委托）
 *      Environment Dictionary（环境字典）
 *  
 *  使用 OWIN 搭建 OAuth2 认证服务器
 *      认证服务器指 authorization server ， 负责在资源所有者 （最终用户） 通过认证之后， 
 *      向客户端应用颁发凭据 (code) 和对客户端授权 (access_token) 。
 * **/

using System;
using Owin;
using Microsoft.Owin;
using Microsoft.Owin.Cors;
using Microsoft.Owin.Security.OAuth;
using Application.WebAPI.Provider;

namespace Application.WebAPI
{
    /// <summary>
    /// Startup
    /// </summary>
    partial class Startup
    {
        public const string AuthenticationType = "OAuth2";

        public void ConfigureAuth(IAppBuilder app)
        {
            OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                AuthenticationType = AuthenticationType,
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString(Paths.TokenPath),
                AccessTokenExpireTimeSpan = TimeSpan.FromHours(2),
                Provider = new OAuth2OAuthAuthorizationServerProvider(),
                RefreshTokenProvider = new OAuth2RefreshTokenProvider(),
                ApplicationCanDisplayErrors = true
            };
            //AuthenticationType ：认证类型
            //AllowInsecureHttp : 如果允许客户端的 return_uri 参数不是 HTTPS 地址， 则设置为 true
            //TokenEndpointPath : 客户端应用可以直接访问并得到访问令牌的地址， 必须以前倒斜杠 "/" 开始， 例如： /Token
            //AccessTokenExpireTimeSpan ：Token过期时间
            //Provider : 应用程序提供和 OAuth 认证中间件交互的 IOAuthAuthorizationServerProvider 实例， 通常可以使用默认的	
            //OAuthAuthorizationServerProvider ， 并设置委托函数即可                
            //RefreshTokenProvider ：刷新令牌， 如果这个属性没有设置， 则不能从 /Token 刷新令牌

            // 令牌生成
            app.UseOAuthAuthorizationServer(OAuthServerOptions);

            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

            //跨域处理
            app.UseCors(CorsOptions.AllowAll);
        }
    }
}